#ifndef CACHEPATHINFO_H
#define CACHEPATHINFO_H

#include <QString>
#include <QDateTime>
#include <QDir>
#include <QDebug>

/**
 * CachePathInfo - 文件级缓存路径信息封装类
 *
 * Martin Fowler重构模式应用：
 * - Extract Class: 从UnifiedCacheManager中提取缓存路径逻辑
 * - Replace Data Value with Object: 用对象替换简单的路径字符串
 * - Encapsulate Field: 封装缓存路径访问和计算逻辑
 *
 * 解决问题：
 * - 缓存目录配置变更后，旧缓存文件无法正确定位和清理
 * - 缓存路径计算逻辑分散在多个组件中
 * - 缺乏文件级缓存路径持久化机制
 */
class CachePathInfo
{
public:
    // === 构造函数 ===
    CachePathInfo() = default;
    explicit CachePathInfo(const QString& actualCacheDirectory);
    CachePathInfo(const QString& actualCacheDirectory, const QString& fileIdentity);

    // === Martin Fowler Strategy Pattern: 路径计算策略 ===

    /**
     * 获取文件的实际缓存目录（文件级存储的路径）
     * @return 实际缓存目录路径，如果为空则使用当前全局配置
     */
    QString getActualCacheDirectory() const;

    /**
     * 获取文件的完整缓存目录路径（包含文件标识子目录）
     * @param fileIdentity 文件标识
     * @return 完整的缓存目录路径
     */
    QString getFullCacheDirectory(const QString& fileIdentity) const;

    /**
     * 获取指定页面的缓存文件路径
     * @param fileIdentity 文件标识
     * @param pageIndex 页面索引
     * @return 页面缓存文件完整路径
     */
    QString getPageCacheFilePath(const QString& fileIdentity, int pageIndex) const;

    /**
     * 获取缩略图缓存目录路径
     * @param fileIdentity 文件标识
     * @return 缩略图缓存目录路径
     */
    QString getThumbnailCacheDirectory(const QString& fileIdentity) const;

    /**
     * 获取指定缩略图的缓存文件路径
     * @param fileIdentity 文件标识
     * @param thumbnailIndex 缩略图索引
     * @return 缩略图缓存文件完整路径
     */
    QString getThumbnailCacheFilePath(const QString& fileIdentity, int thumbnailIndex) const;

    // === 缓存目录管理 ===

    /**
     * 设置实际缓存目录（通常在创建缓存时调用）
     * @param directory 实际使用的缓存目录
     */
    void setActualCacheDirectory(const QString& directory);

    /**
     * 检查缓存目录是否存在
     * @param fileIdentity 文件标识
     * @return 如果缓存目录存在返回true
     */
    bool cacheDirectoryExists(const QString& fileIdentity) const;

    /**
     * 创建缓存目录（如果不存在）
     * @param fileIdentity 文件标识
     * @return 如果创建成功或已存在返回true
     */
    bool ensureCacheDirectoryExists(const QString& fileIdentity) const;

    /**
     * 删除整个缓存目录
     * @param fileIdentity 文件标识
     * @return 如果删除成功返回true
     */
    bool removeCacheDirectory(const QString& fileIdentity) const;

    // === 路径兼容性处理 ===

    /**
     * 检查是否使用了全局配置路径（向后兼容）
     * @return 如果使用全局配置返回true
     */
    bool isUsingGlobalConfig() const;

    /**
     * 更新为当前全局配置路径（用于配置变更后的迁移）
     * @param newGlobalCacheDirectory 新的全局缓存目录
     */
    void updateToGlobalConfig(const QString& newGlobalCacheDirectory);


    // === 实用工具方法 ===

    /**
     * 生成标准的页面缓存文件名
     * @param pageIndex 页面索引
     * @return 格式化的文件名（如 "page_00001.png"）
     */
    static QString generatePageFileName(int pageIndex);

    /**
     * 生成标准的缩略图缓存文件名
     * @param thumbnailIndex 缩略图索引
     * @return 格式化的文件名（如 "thumb_00001.png"）
     */
    static QString generateThumbnailFileName(int thumbnailIndex);

    /**
     * 从页面缓存文件名解析页面索引
     * @param fileName 文件名
     * @return 页面索引，如果解析失败返回-1
     */
    static int parsePageIndexFromFileName(const QString& fileName);

    // === 调试和状态信息 ===

    /**
     * 获取缓存路径状态信息
     * @param fileIdentity 文件标识
     * @return 格式化的状态信息字符串
     */
    QString getStatusInfo(const QString& fileIdentity) const;

    /**
     * 检查缓存路径配置是否有效
     * @return 如果配置有效返回true
     */
    bool isValid() const;

    // === 序列化支持 ===

    /**
     * 转换为字符串表示（用于存储）
     * @return 序列化字符串
     */
    QString toString() const;

    /**
     * 从字符串恢复（用于加载）
     * @param str 序列化字符串
     * @return CachePathInfo对象
     */
    static CachePathInfo fromString(const QString& str);

    // === 比较操作符 ===
    bool operator==(const CachePathInfo& other) const;
    bool operator!=(const CachePathInfo& other) const;

private:
    // === 私有成员变量 ===

    QString m_actualCacheDirectory;     // 文件实际使用的缓存目录
    QDateTime m_createdTime;            // 路径信息创建时间

    // === 私有工具方法 ===

    /**
     * 获取当前全局缓存目录（fallback机制）
     * @return 当前全局缓存目录
     */
    QString getCurrentGlobalCacheDirectory() const;

    /**
     * 规范化路径格式
     * @param path 原始路径
     * @return 规范化后的路径
     */
    static QString normalizePath(const QString& path);
};

// === QDebug支持 ===
QDebug operator<<(QDebug debug, const CachePathInfo& pathInfo);

#endif // CACHEPATHINFO_H